/**
 * 
 */
package kr.pe.johnkim.dayve.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import kr.pe.johnkim.dayve.provider.DayveItem;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Log;

/**
 * My History 공통 기능들을 구현하는 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class DayveCommon {
	public static String TAG = DayveCommon.class.getSimpleName();

	/**
	 * 현재 날짜와 시간을 2010-10-22 15:20:46 포멧의 string 으로 반환한다.
	 * 
	 * @return
	 */
	public String getCurrentDate() {
		Log.i(TAG, "getCurrentDate");
		String currentDate = "";

		Date date = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		currentDate = simpleDateFormat.format(date);

		return currentDate;
	}

	/**
	 * "2012-1-3 09:20" 의 날짜 포멧을 
	 * "2012년 1월 3일 오전 9시 20분" 의 날짜 포멧으로 바꿔준다.
	 *   
	 * @param beforeDate
	 * @return String
	 */
	public String getDateFormat(String beforeDate) {
		//		Log.i(TAG, "getDateFormat");

		DateFormat dateFormat = new SimpleDateFormat("yyyy-M-d HH:mm");
		Date dRegistDate = null;

		try {
			dRegistDate = dateFormat.parse(beforeDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		DateFormat dateFormat2 = new SimpleDateFormat("yyyy년 M월 d일 a h시 m분");

		return dateFormat2.format(dRegistDate);
	}
	
	public String getOnlyDateDateFormat(String beforeDate) {
		DateFormat dateFormat = new SimpleDateFormat("yyyy-M-d HH:mm");
		Date dRegistDate = null;

		try {
			dRegistDate = dateFormat.parse(beforeDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		DateFormat dateFormat2 = new SimpleDateFormat("M월 d일. yyyy");

		return dateFormat2.format(dRegistDate);
	}
	
	public String getOnlyTimeDateFormat(String beforeDate) {
		DateFormat dateFormat = new SimpleDateFormat("yyyy-M-d HH:mm");
		Date dRegistDate = null;

		try {
			dRegistDate = dateFormat.parse(beforeDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		DateFormat dateFormat2 = new SimpleDateFormat("a h시 m분");

		return dateFormat2.format(dRegistDate);
	}

	/**
	 * "2012-1-3 09:20" 의 날짜 포멧을 
	 * "오전 9시 20분" 의 날짜 포멧으로 바꿔준다.
	 *   
	 * @param beforeDate
	 * @return String
	 */
	public String getSimpleDateFormat(String beforeDate) {
		//		Log.i(TAG, "getSimpleDateFormat");

		DateFormat dateFormat = new SimpleDateFormat("yyyy-M-d HH:mm");
		Date dRegistDate = null;

		try {
			dRegistDate = dateFormat.parse(beforeDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		DateFormat dateFormat2 = new SimpleDateFormat("a h시 m분");

		return dateFormat2.format(dRegistDate);
	}

	/**
	 * Category Analysis Graph 를 출력할 데이터로 가공한다.
	 * 
	 * 1, 2, 3위 와 기타 항목으로 구분한다.
	 * 
	 * @param parameterList
	 * @return
	 */
	public ArrayList<DayveItem> getCategoryAnalysisGraphData(ArrayList<DayveItem> parameterList) {

		Log.e(TAG, "parameterList.size() : " + parameterList.size());

		for(int m=0 ; m<parameterList.size() ; m++) {
			Log.e(TAG, "> " + parameterList.get(m).getName() + ", " + parameterList.get(m).getAmount());
		}

		List<DayveItem> resultList = new ArrayList<DayveItem>();

		DayveItem temp1 = new DayveItem();
		temp1.setName("");
		temp1.setAmount("0");
		temp1.setModifyDate("");
		temp1.setPercent("0");

		DayveItem temp2 = new DayveItem();
		temp2.setName("");
		temp2.setAmount("0");
		temp2.setModifyDate("");
		temp2.setPercent("0");

		DayveItem temp3 = new DayveItem();
		temp3.setName("");
		temp3.setAmount("0");
		temp3.setModifyDate("");
		temp3.setPercent("0");

		DayveItem temp4 = new DayveItem();
		temp4.setName("기타");
		temp4.setAmount("0");
		temp4.setModifyDate("");
		temp4.setPercent("0");

		resultList.add(temp1);
		resultList.add(temp2);
		resultList.add(temp3);
		resultList.add(temp4);

		DayveItem sItem = new DayveItem();
		DayveItem sItem2 = new DayveItem();
		int total = 0;

		/**
		 * resultList 에 순위가 지정될 temp Item 들을 정의하고
		 * 가장 마지막 temp Item 에 나머지 아이템들의 Amount 가 합산되어 저장된다.
		 */
		for(int i = 0; i < parameterList.size(); i++) {
			if(parameterList.get(i).getAmount().length() < 1) {
				parameterList.get(i).setAmount("0");
			}

			sItem.setAmount(parameterList.get(i).getAmount());
			sItem.setName(parameterList.get(i).getName());

			total += Integer.parseInt(sItem.getAmount());	// 전체개수

			for(int j=0 ; j<resultList.size()-1 ; j++) {
				// j위 선별
				if(Integer.parseInt(sItem.getAmount()) > Integer.parseInt(resultList.get(j).getAmount())) {	// j위. 새로 들어온게 더 클때
					sItem2.setAmount(resultList.get(j).getAmount());		// j 위값 바꾸기 위해 임시 저장.
					sItem2.setName(resultList.get(j).getName());
					// 새로들어온 --> 새로운 j 위
					resultList.get(j).setAmount(sItem.getAmount());	
					resultList.get(j).setName(sItem.getName());	

					sItem.setAmount(sItem2.getAmount());		// 기존 j 위 ---> 임시
					sItem.setName(sItem2.getName());
				}
			}
			
			if(parameterList.size() > 3) {
				resultList.get(resultList.size()-1).setAmount("" + (Integer.parseInt(resultList.get(resultList.size()-1).getAmount()) + Integer.parseInt(sItem.getAmount())));
			}

		}

		int pSum = 0;
		for(int i=0 ; i<resultList.size() ; i++) {

			double tempPercent =  (Integer.parseInt(resultList.get(i).getAmount()) / (double)total) * 100; // 백분율 구하기

			if(i == resultList.size()-1) {
				if(Integer.parseInt(resultList.get(i).getAmount()) > 0){
					resultList.get(i).setPercent(Integer.toString(100 - pSum)); // 마지막 index 기타 
				}

			} else {
				resultList.get(i).setPercent(Integer.toString((int)tempPercent));	    		
			}

			pSum += (int)tempPercent;
		}

		return (ArrayList<DayveItem>) resultList;
	}

	/**
	 * 입력된 문자열의 유효성을 체크 한다.
	 * 알파벳 대소문자, 숫자, -, _ 만 유효하다.
	 * 
	 * 유효하면 true 를, 유효하지 않으면 false 를 반환 한다.
	 * 
	 * @param inputString
	 * @return
	 */
	public boolean checkInputCharacter(String inputString) {
		boolean result = false;

		String compareString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";

		//		if(!inputString.matches("[0-9|a-z|A-Z]*")){ 
		//			result = "NOT_AVAILABLE";
		//		} else {
		//			result = "AVAILABLE";
		//		}

		for(int i=0 ; i<inputString.length() ; i++) {
			if(compareString.indexOf(inputString.substring(i, i+1)) < 0) {
				result = false;
			} else {
				result = true;
			}
		}

		return result;
	}

	/**
	 * 입력받은 이메일 주소의 유효성을 검사 한다.
	 * 
	 * 유효하면 true 를, 유효하지 않으면 false 를 반환 한다.
	 * 
	 * @param inputEmail
	 * @return
	 */
	public boolean checkInputEmail(String inputEmail) {
		Pattern pattern=Pattern.compile("\\w+[@]\\w+\\.\\w+");
		Matcher match=pattern.matcher(inputEmail);

		return match.find();
	}

	/**
	 * app 쉐어드 프레퍼런스에 값을 저장한다.
	 * 
	 * @param context
	 * @param key
	 * @param value
	 */
	public static void setAppPreferences(Activity context, String key, String value) {
		SharedPreferences pref = null;
		pref = context.getSharedPreferences("FacebookCon", 0);
		SharedPreferences.Editor prefEditor = pref.edit();
		prefEditor.putString(key, value);

		prefEditor.commit();
	}

	/**
	 * app 쉐어드 프레퍼런스에서 값을 읽어온다.
	 * 
	 * @param context
	 * @param key
	 * @return
	 */
	public static String getAppPreferences(Activity context, String key) {
		String returnValue = null;

		SharedPreferences pref = null;
		pref = context.getSharedPreferences("FacebookCon", 0);

		returnValue = pref.getString(key, "");

		return returnValue;
	}

	/**
	 * Graphe 를 그림파일로 저장 한다.
	 * 
	 * @param bm
	 * @return
	 */
	public String screenshot(Bitmap bm) {
		Log.i(TAG, "screenshot");

		String temp = "/sdcard/";					// 디렉토리. 
		temp = temp + "dayve_screen_capture";		// 파일 명.
		temp = temp + ".jpg";						// 확장자 명.

		try {
			File path = new File("/sdcard");

			if(! path.isDirectory()) {
				path.mkdirs();
				Log.e(TAG, "mkdirs");
			}

			FileOutputStream out = new FileOutputStream(temp);
			bm.compress(Bitmap.CompressFormat.JPEG, 100, out);

			//			Log.e(TAG, "byte : " + bm.getRowBytes());
			//			Log.e(TAG, ">>>>>>>>>>");
			//			Log.e(TAG, Environment.getExternalStorageDirectory().toString());

		} catch (FileNotFoundException e) {
			Log.e("FileNotFoundException:", e.getMessage());
		}

		return "/mnt" + temp;
	}
}
